iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 24
0
自我挑戰組

我的語言自學接力系列 第 24

D24:[Java]啟動執行緒

  • 分享至 

  • xImage
  •  

在[Java]多執行緒(基本觀念)當中,提了一個不好的範例做示範。
那我們該如何啟動多個執行緒?

  • 建立延伸自 Thread 類別的子類別
  • 執行緒必須寫在 run() 函數中

滿足以上兩點便可啟動執行緒。那麼一定會有疑惑:
建立子類別? run() 函數?

Thread 就是執行緒的意思,他存放在 java.lang 類別庫當中,平時會自動載入。
而 run() 是Thread類別當中的一個函數。

那麼瞭解了這些,我們該怎麼啟動執行緒呢?

class 類別名稱 extends Thread
{
  資料成員;
  函數;
  run()
  {
    //執行緒
  }
}

會建立子類別的目的,是我們可以進行 override 改寫的動作,改寫來自Thread類別當中的 run() 函數。

讓我們修改在[Java]多執行緒(基本觀念)當中不好的範例做示範:

首先建立子類別:

class multi_Test extends Thread
{
   private String name;
   public CTest(String str)
   {
      name=str;
   }
   public void run()
   {
      //執行緒
   }
}

並將執行緒寫在run()函數中:

public void run()
   {
      for(int i=0;i<3;i++)
      {
         for(int j=0;j<100000000;j++);
         System.out.println(name);
      }
   }

在main() 中:使用 start來呼叫。

multi_Test apple=new multi_Test("apple");
multi_Test pen=new multi_Test("pen");
apple.start();
pen.start();


這時疑問來了,為什麼要使用 start() ?
如果直接呼叫 run() ,這樣並無法啟動執行緒,只是再將執行緒執行一遍而已;
因此結果只是會與在[Java]多執行緒(基本觀念)當中,不好的範例相同。

因為我們繼承了來自 Thread 類別,也會繼承當中的 start() 。
而這個 start() 會在 scheduler 排程器中登入執行緒,當執行緒開始執行 run() 才被呼叫。

以下完整程式碼參考:

class multi_Test extends Thread
{
   private String name;
   public CTest(String str)
   {
      name=str;
   }
   public void run()
   {
      for(int i=0;i<3;i++)
      {
         for(int j=0;j<100000000;j++);
         System.out.println(name);
      }
   }
}

public class multi_thread_2
{
   public static void main(String args[])
   {
      multi_Test apple=new multi_Test("apple");
      multi_Test pen=new multi_Test("pen");
      apple.start();
      pen.start();
   }
}

如果您喜歡我的文章,可以至 4xDevJava 學習系列閱讀更多 Java 文章。


上一篇
D23:[Java]多執行緒(基本觀念)
下一篇
D25:[Java]實作 Runnable 介面
系列文
我的語言自學接力31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言